class Page {
    static async create(browser, client) {
        // CDP 每个域的使用都要先开启下，创建 Page 对象的时候我们已经开启了 Page 域的协议
        await client.send('Page.enable', {});
        const page = new Page(browser, client);
        return page;
    }
    // 需要传入浏览器实例和 CDP 客户端。
    constructor(browser, client) {
        this._browser = browser;
        this._client = client;
    }

    async navigate(url) {
        // 通过 CDP 协议里的 Page.navigate 来导航到某个 url，在 Page.loadEventFired 的时候 resolve。
        var loadPromise = new Promise(resolve => this._client.once('Page.loadEventFired', resolve)).then(() => true);
        await this._client.send('Page.navigate', {url});
        return await loadPromise;
    }

    // 开始做一些页面级别的控制
    async setContent(html) {
        var resourceTree = await this._client.send('Page.getResourceTree', {});
        // 这个是设置 Page 的 html 内容的 CDP 协议，需要传入 frameId，这个可以通过 Page.getResourceTree 拿到。
        await this._client.send('Page.setDocumentContent', {
            frameId: resourceTree.frameTree.frame.id,
            html: html
        });
    }
    async close() {
        this._client.close()
    }
}

export {
    Page
}